// BrowserWindow 只有主进程 mian.js 才能使用
// ipc 时进程之间通信的工具，主进程中引入 ipcMain， 渲染进程中引入 ipcRenderer
const { app, BrowserWindow, ipcMain, dialog, net } = require('electron')

// const { axios } = require('./axios')

const DataStore = require('./renderer/MusicDataStore')
const { log, e } = require('./renderer/helper')

const myStore = new DataStore({'name': 'Music Data'})

class AppWindow extends BrowserWindow {
    constructor(config, fileLocation) {
        const basicConfig = {
            width: 800,
            height: 600,
            icon: './build/lk-4.ico',
            autoHideMenuBar: true,
            webPreferences: {
                // 这个参数设置为 true 表示在这个程序中可以使用 node API
                nodeIntegration:true
            }
        }
        // 遇到相同 key 后面参数会覆盖前面 basicConfig 参数
        const finalConfig = { ...basicConfig, ...config }
        super(finalConfig)
        this.loadFile(fileLocation)
        this.once('ready-to-show', () => {
            this.show()
        })
    }
}

app.on('ready', () => {
    // 创建一个 BrowserWindow 实例，这个窗口实例的的参数写在一个对象中
    const mainWindow = new AppWindow( {}, 'renderer/index.html')
    mainWindow.webContents.on('did-finish-load', () => {
        // log('finish load')
        mainWindow.send('getTracks', myStore.getTracks())
    })
    ipcMain.on('open-devtools', (event, arg) => {
        mainWindow.openDevTools();
    })
    // 接收添加音乐事件
    ipcMain.on('add-music-window', () => {
        const addMusicWindow = new AppWindow({
            width: 400,
            height: 300,
            parent: mainWindow
        }, './renderer/add/add.html')
    })

    // 接收 打开选择文件窗口 事件
    ipcMain.on('open-choose-music', (event) => {
        dialog.showOpenDialog({
            properties: ['openFile', 'multiSelections'],
            filters: [{ name: 'Music', extensions: ['mp3'] }]
        }, (filePaths) => {
            event.sender.send('choosed-music-filePaths', filePaths)
        })
    })

    ipcMain.on('import-music', (event, tracks) => {
        // log('before', myStore.tracks)
        const updatedTracks = myStore.addTracks(tracks).getTracks(tracks)
        // log('end', myStore.tracks)
        // 打印数据保存路径
        // log('dataPath', app.getPath('userData'))
        mainWindow.send('getTracks', updatedTracks)
        // addMusicWindow.close()
    })

    ipcMain.on('delete-track', (event, id) => {
        // log('1', myStore.tracks)
        const updatedTracks = myStore.deleteTrack(id).getTracks()
        // log('2', myStore.tracks)
        mainWindow.send('getTracks', updatedTracks)
    })

    // 接收 搜索音乐窗口 事件
    ipcMain.on('search-music-window', (event) => {
        // 创建新窗口
        const searchMusicWindow = new AppWindow({
            width: 700,
            height: 500,
            parent: mainWindow
        }, './renderer/search/search.html')
    })
    // 发起搜索音乐请求
    // ipcMain.on('req-music', (event, keyword) => {
    //     keyword = encodeURIComponent(keyword)
    //     axios
    //     .get(`http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s=${keyword}&type=1&offset=0&total=true&limit=10`)
    //     .then((res) => {
    //         event.sender.send('res-music', res.data)
    //     })
    // })

    // // on 方法监听进程之间通信的事件 第一个参数是事件（自定义名字），
    // // 第二个参数是一个匿名函数，event 代表事件对象，arg 就是发送者发送的内容。
    // ipcMain.on('massage', (event, arg) => {
    //     console.log(arg)
    //     event.sender.send('reply', 'hello renderer')
    // })

})